#ifndef _MVDATA_SUBMB_H_
#define _MVDATA_SUBMB_H_

#include <list>
#include "MVDataMB.h"
#include "MVDataSubSubMB.h"
#include "MVDataMBCommon.h"

///@brief 封装Sub Macro Block结构，仅在库内部使用
class CMVDataSubMB : public CMVDataMBCommon
{
//============================== 一般方法 ====================================
public:
	// 构造和析构函数
	CMVDataSubMB();
	CMVDataSubMB( TYPE_SUB_MB type );
	CMVDataSubMB( const CMVDataSubMB& sub_mb );
	~CMVDataSubMB();

public:
	///@brief 复制内部所有的属性及逻辑成员对象
	CMVDataSubMB& operator = ( const CMVDataSubMB& sub_mb );

//============================== 属性方法 ====================================
public:
	///@brief 当前是否含有Sub Sub MB
	bool HaveSubSubMB() const;
	///@brief 根据MB类型判断是否应当含有Sub MB
	bool ShouldHaveSubSubMB() const;

	///@brief 设置Sub MB位置
	int SetLoc( LOC_BLOCK loc );
	///@brief 取得Sub MB位置
	LOC_BLOCK GetLoc() const;

	///@brief 设置Sub MB类型
	int SetSubMBType( TYPE_SUB_MB type );
	///@brief 取得Sub MB类型
	TYPE_SUB_MB GetSubMBType() const;

public:
	//@brief 增加一个新的Sub Sub Macro Block，无排序
	int AddSubSubMB( const CMVDataSubSubMB* sub_sub_mb );

	//@brief 迭代访问所有的Sub Macro Block，当curr_mb==NULL时返回第一个Sub Macro Block
	const CMVDataSubSubMB * GetNextSubSubMB( const CMVDataSubSubMB * curr_sub_sub_mb ) const;

	//@brief 取得指定位置的一个Sub Sub Macro Block
	const CMVDataSubSubMB * GetSubSubMBByLocation( LOC_BLOCK mbloc ) const;

	///@brief 从 CMVDataBlock 类型对象中拷贝数据
	int CopyDataFromBlock( const CMVDataBlock * block );

	///@brief 检查合法性
	bool CheckValidation() const;

//============================== 类成员 ====================================
private:
	LOC_BLOCK m_eLoc;
	std::list<CMVDataSubSubMB*> * m_plstSubSubMB;
	TYPE_SUB_MB m_typeSubMBType;

	friend class CMVDataAgent;
	friend class CMVDataAgentXML;
};



#endif // _MVDATA_SUBMB_H_
